#ifndef __SE_STRING_SPLIT_HPP__
#define __SE_STRING_SPLIT_HPP__

#include <string>
#include <vector>
#include <memory>

namespace se {

// 字符串分割类
class StringSplit final {
public:
    // 字符串编码规则
    enum Encoding {
        UTF8,
        GBK,
        GB2312,
        ASIIC
    };

public:
    StringSplit() = delete;  // 静态类，不可构造对象
    /**
     * @brief 通过特定的编码格式将字符串分割成单个字符
     * 
     * @param stringToSplit 要分割的字符串
     * @param encoding 字符串的编码方式
     * @return std::vector< std::string > 返回由单个字符组成的字符串数组
     */
    static std::shared_ptr<std::vector<std::string>> split(const std::string &stringToSplit, Encoding encoding = UTF8);

private:
    /**
     * @brief 通过UTF-8的编码方式，将字符串分割成单个字符
     * 
     * @param stringToSplit 要分割的字符串
     * @return std::vector< std::string > 返回分割的结果
     */
    static std::shared_ptr<std::vector<std::string>> splitWithUtf8(const std::string &stringToSplit);

    /**
     * @brief 在UTF-8编码的情况下，输入第一个字节，判断这个字符是多少个字节的
     * 
     * @param character 字符的首字节
     * @return size_t 字符长度，未识别时返回1，当作一个字符处理
     */
    static size_t getUtf8CharacterLength(char character);
};

}  // namespace se

#endif
